
package Report;

import java.io.Serializable;
import java.util.Date;

/**
 * Basisklasse aller Reports. Reports sind als <code>Serializable</code>
 * deklariert, damit sie von dem Server an den Client gesendet werden können.
 * Der Zugriff auf Reports erfolgt also nach deren Bereitstellung lokal auf dem
 * Client. Dies ist eine alternative Form des Zugriffs auf Information, die durch
 * den Server zur Verfügung gestellt wird.<p>
 *
 * Die Entscheidung zwischen einer
 * Realisierung mittels <code>Serializable</code>oder <code>UnicastRemoteObject</code>
 * sollte wohlüberlegt sein. Hierbei spielen z.B. die Häufigkeit des Zugriffs,
 * ein möglicher konkurrierender Zugriff und die erforderliche Aktualität der
 * Daten eine Rolle.<p>
 *
 * Ein Report besitzt eine Reihe von Standardelementen. Sie werden mittels
 * Attributen modelliert und dort dokumentiert.
 *
 * @see Report
 * @author Thies (Quelle: BankProjekt 1.1)
 * @author Philipp Armbruster
 */
public class Report implements Serializable {

	/**
	 * Ein kleines Impressum, das eine Art Briefkopf darstellt. Jedes Unternehmen bildet darin
	 * einige Daten wie Firmenname, Adresse, Logo, etc. auf Geschäftsdokumenten ab.
	 * Dies gilt auch für die hier realisierten Reports.
	 */
	private Paragraph imprint = null;

	/**
	 * Kopfdaten des Berichts.
	 */
	private Paragraph headerData = null;

	/**
	 * Jeder Bericht kann einen individuellen Titel besitzen.
	 */
	private String title = "Report";

	/**
	 * Datum der Erstellung des Berichts.
	 */
	private Date dateOfReport = new Date();

        /**
         * Array mit Wochentagen um den Wochentag des eines Datums zu ermitteln
         */
        String[] weekdays = {"Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"};

        /* 
         * Array mit Monatsbezeichnungen um den Monat eines Datums zu ermitteln
         */
        String[] months = {"Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"};

	/**
	 * Auslesen des Impressums.
	 * @return Text des Impressums
	 */
	public Paragraph getImprint() {
		return imprint;
	}

	/**
	 * Setzen des Impressums.
	 * @param imprint Text des Impressums
	 */
	public void setImprint(Paragraph imprint) {
		this.imprint = imprint;
	}

	/**
	 * Auslesen der Kopfdaten.
	 * @return Text der Kopfdaten.
	 */
	public Paragraph getHeaderData() {
		return headerData;
	}

	/**
	 * Setzen der Kopfdaten.
	 * @param headerData Text der Kopfdaten.
	 */
	public void setHeaderData(Paragraph headerData) {
		this.headerData = headerData;
	}

	/**
	 * Auslesen des Berichtstitels.
	 * @return Titeltext
	 */
	public String getTitle() {
		return title;
	}

	/**
	 * Setzen des Berichtstitels.
	 * @param title Titeltext
	 */
	public void setTitle(String title) {
		this.title = title;
	}

	/**
	 * Auslesen des Erstellungsdatums.
	 * @return Datum der Erstellung des Berichts
	 */
	public Date getDateOfReport() {
		return dateOfReport;
	}

	/**
	 * Setzen des Erstellungsdatums. <b>Hinweis:</b> Der Aufruf dieser Methoden
	 * ist nicht unbedingt erforderlich, da jeder Report bei seiner Erstellung
	 * automatisch den aktuellen Zeitpunkt festhält.
	 *
	 * @param dateOfReport Zeitpunkt der Erstellung
	 */
	public void setDateOfReport(Date dateOfReport) {
		this.dateOfReport = dateOfReport;
	}

        /**
         * Diese Methode wandelt ein Dateobjekt in einen StringBuffer in folgender Schreibweise um, z.B. 'Montag, 01. Januar 2012'
         *
         * @param date, das zu konvertierende Date-Objekt
         * @return Datum als StringBuffer
         */
        public StringBuffer convertDateToString(Date date) {

            // Integerwert des Wochentages auslesen und über das Array 'weekdays' die passende Bezeichnung in String-Variable speichern
            Integer indexOfWeekday = date.getDay();
            String weekdayOfDate = new String(weekdays[indexOfWeekday]);

            // Integerwert des Tages auslesen und in String-Variable speichern
            String dayOfDate = String.valueOf(date.getDate());

            // Integerwert des Monats auslesen und über das Array 'months' die passende Bezeichnung in String-Variable speichern
            Integer indexOfMonth = date.getMonth();
            String monthOfDate = new String(months[indexOfMonth]);

            /* Integerwert des Jahres auslesen und nach entsprechender Umrechnung, Integerwert ist z.B. beim Jahr 2011  111,
             * daher wird der Integerwert mit der Zahl 1900 addiert um so den Wert in der String-Variable als 2011 speichern zu können. */
            Integer intOfYear = date.getYear();
            Integer intOfYearPlus1900 = intOfYear + 1900;
            String yearOfDate = String.valueOf(intOfYearPlus1900);

            StringBuffer dateAsStringBuffer = new StringBuffer();
                dateAsStringBuffer.append(weekdayOfDate + ", ");
                dateAsStringBuffer.append(dayOfDate + ". ");
                dateAsStringBuffer.append(monthOfDate + " ");
                dateAsStringBuffer.append(yearOfDate);

            return dateAsStringBuffer;
        }

        /**
         * Diese Methode wandelt ein Dateobjekt in einen StringBuffer in folgender Schreibweise um, z.B. '01.12.2012'
         *
         * @param date, das zu konvertierende Date-Objekt
         * @return Datum als StringBuffer
         */
        public StringBuffer convertDateToStringWithoutWeekday(Date date) {

            // Integerwert des Tages auslesen und in String-Variable speichern
            String dayOfDate = String.valueOf(date.getDate());

            /* Integerwert des Monats auslesen und über eine Addition, Monat Dezember hat nach dem auslesen aus dem Date-Objekt
             * den Wert 11, daher erfolgt eine Addition um 1 sodass Dezember den Wert 12 erhält. 
             * Dieser Wert wird in String-Variable gespeichern */
            Integer intOfMonth = date.getMonth();
            Integer intOfMonthPlus1 = intOfMonth + 1;
            String monthOfDate = String.valueOf(intOfMonthPlus1);

            /* Integerwert des Jahres auslesen und nach entsprechender Umrechnung, Integerwert ist z.B. beim Jahr 2011  111,
             * daher wird der Integerwert mit der Zahl 1900 addiert um so den Wert in der String-Variable als 2011 speichern zu können. */
            Integer intOfYear = date.getYear();
            Integer intOfYearPlus1900 = intOfYear + 1900;
            String yearOfDate = String.valueOf(intOfYearPlus1900);

            StringBuffer dateAsStringBuffer = new StringBuffer();
                dateAsStringBuffer.append(dayOfDate + ".");
                dateAsStringBuffer.append(monthOfDate + ".");
                dateAsStringBuffer.append(yearOfDate);

            return dateAsStringBuffer;
        }
}
